//
//  HMStatusCellViewModel.swift
//  WeiBo
//
//  Created by apple on 16/6/26.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit

class HMStatusCellViewModel: NSObject {

    var model: HMStatusModel?
    
    init(model: HMStatusModel) {
        self.model = model
    }
    
    
    var photoUrl: NSURL? {
        
        if let urlStrig = model?.user?.profile_image_url{
            // 赋值
           return NSURL(string: urlStrig)
            
        }
        return NSURL()
    }
    
///   昵称
    var name: String? {
        return model?.user?.screen_name
    }
///  内容
    var content: String?{
        return model?.text
    }
    ///等级图片
    var levelImage: UIImage? {
        
        if let level = model?.user?.mbrank {
            
                            return UIImage(named: "common_icon_membership_level\(level)")
            
                        }
        
        return UIImage()
    }
    /// 认证图片
    var verifyImage: UIImage? {
    
        if let type = model?.user?.verified_type {
            
            switch type {

            case -1: return UIImage()
            case 0: return UIImage(named: "avatar_grassroot")
            case 2,3,5: return UIImage(named: "avatar_enterprise_vip")
            case 220: return UIImage(named: "avatar_vip")

            default : return UIImage()
                
            }
            
        }
        
        return UIImage()
        
    }
    
    
///  转发按钮的标题
    var retweetString: String? {
        
        if model?.reposts_count == 0 {
            return "转发"
        } else {
            return "\(model?.reposts_count ?? 0)"
        }
        
    }
    
///  评论按钮标题
    var commentString: String? {
        if model?.comments_count == 0 {
            return "评论"
        } else {
            return "\(model?.comments_count ?? 0)"
        }
    }
///  点赞按钮的标题
    var goodString: String? {
    
        if model?.attitudes_count == 0 {
            
            return "赞"
        } else {
            
            return  "\(model?.attitudes_count ?? 0)"
        }
        
    }
    
    
///  转发的内容
    var retweet_statusString: String? {
        
        return model?.retweeted_status?.text
    }
    /// 来源字符串
    var sourceString: String? {
        return dealSource(model?.source)
    }
    
    var createtimeString: String? {
        
        return dealCreateTime(model?.created_at)
    }
    // 远程微博的AttributeSting
    
    var attributeString: NSAttributedString?{
        return dealEmoticonText(model?.text)
        
    }
    // 转发微博的AttributeString
    var retweetAttributeString: NSAttributedString?{
        return dealEmoticonText(model?.retweeted_status?.text)
    }
    
///  来源的数据处理 -- 等大家讲到实用技术的时候,会讲正则
    
    private func dealSource(source: String?) -> String?{
        
        // "<a href=\"http://app.weibo.com/t/feed/6vtZb0\" rel=\"nofollow\">微博 weibo.com</a>"
        // "<a href=\"http://app.weibo.com/t/feed/2cEJdS\" rel=\"nofollow\">IT之家</a>"
        
        /*
            "<a href=\"http://app.weibo.com/t/feed/2cEJdS\" rel=\"nofollow\"
            IT之家</a
            "
        
        
            IT之家
            /a
        */
        // 1. 根据字符来分割字符串,返回分割后的字符串数组
        let subSourceArray = source?.componentsSeparatedByString(">")
        // 2. 判断一下数组的个数,防止崩溃
        if subSourceArray?.count >= 2 {
            
            // 3. 拿到索引为 1 的那个字符串
            let lastArray = subSourceArray![1].componentsSeparatedByString("<")
            
            // 4. 判断一下数组的个数,防止崩溃
            if lastArray.count >= 1 {
                // 返回处理好的字符串
                return lastArray.first
            }
        }
        
        return ""
    }
    
    //MARK:-- 时间的处理
    private func dealCreateTime(createtime: String?) -> String {
        
        guard let createTime = createtime else {
            return ""
        }
        
        // Wed Jun 29 15:49:31 +0800 2016
        
        // 对日期的处理分 2 大步
        /*
            第一步: 需要把 Wed Jun 29 15:49:31 +0800 2016 转换成标准时间 2016-06-29 15:58:58 +0800
            第二步: 我们需要通过日历,来对时间进行比较,到达 发布 刚刚/多少分钟之前的效果
        */
        
        
        let formatter = NSDateFormatter()
        // 设置格式 -- 同学们不要记格式
        
        /*
        设置日期格式 （声明字符串里面每个数字和单词的含义）
        E：星期
        M: 月份
        d：日
        H: 24小时
        m: 分
        s: 秒
        y: 年
        */
        // 这个格式,是要转换字符串的格式
         // Wed Jun 29 15:49:31 +0800 2016
        formatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy"
        
        // 再设置时区
        formatter.locale = NSLocale(localeIdentifier: "en_US")
        
        // 转换时间
        let createDate = formatter.dateFromString(createTime)
//        let createDate = formatter.dateFromString("Wed Jun 28 14:49:31 +0800 2016")
        
        printLog(createDate)
        
        //MARK:-- 第二步
        // 1. 获取一个日历对象
        let calander = NSCalendar.currentCalendar()
        // 2.要比较的 Year.Month .Day 的选项
        let unit = NSCalendarUnit(arrayLiteral: .Year,.Month,.Day,.Hour,.Minute)
        // 3. 对时间进行比较
        let cmps = calander.components(unit, fromDate: createDate!, toDate: NSDate(), options: [])
        
        /*
        如果是今年
        
            是今天
            
                1分钟之内 显示 "刚刚"
                
                1小时之内 显示 "xx分钟前"
                
                其他 显示 "xx小时前"
            
            是昨天 显示 "昨天 HH:mm"
            
            其他 显示 "MM-dd HH:mm"
        
        不是今年 显示 "yyyy-MM-dd"
        */
        // 判断是不是今年
        if cmps.year == 0 {
            
            // 判断是不是这个月
            // 2016-05-28
            // 2016-06-29
            if cmps.month == 0 { // 本月
                
                if cmps.day == 0 { // 今天
                    
                    if cmps.hour == 0 { // 1小时内
                        
                        if cmps.minute == 0 {
                            return "刚刚"
                        } else {
                            return "\(cmps.minute)分钟之前"
                        }
                        
                    } else { // 其他小时之内
                        
                        return "\(cmps.hour)小时之前"
                        
                    }
                    
                } else if cmps.day == 1 { // 昨天
                    // 需要对时间进行处理
                    
                    // 时间格式化
                    formatter.dateFormat = "HH:mm"
                    // 返回格式化后的字符串
                    let str = formatter.stringFromDate(createDate!)
                    return "昨天 \(str)"
                } else {
                    
                    // 设置时间格式
                    formatter.dateFormat = "MM-dd HH:mm"
                    
                    return formatter.stringFromDate(createDate!)
    
                    
                }
                
            }
            
            
        } else { //
            
        }
        
        return ""
    }
    
    //MARK:-- 表情Attribute的处理
    private func dealEmoticonText(text: String?) -> NSAttributedString {
        
        guard let text = text else  {
            return NSAttributedString()
        }
        
        // 定义一个 全局AttributeString
        let globleAttribute = NSMutableAttributedString(string: text)
        
        // 1. 把表情的对象HMEmotion,发送给了 HMPublishViewController
        // 2. 创建了一个NSAttributeString, 拥有一个附件.NStextAttachment, image
        // 3. textView的Attribute = attribute
        
        /*
            text -- 微博内容含有表情的情况有多种
            1.没有表情
            2.有一个表情 -> [微笑]
            3.有多个表情
        */
        // I [嘻嘻] U
        
        /*
        
        . 匹配任意字符，除了换行
        
        () 锁定要查找的内容
        
        * 匹配任意长度的内容
        
        ？尽量少的匹配
        
            \\[.*?\\]
        */
        // 分析正则为主
         let pattern = "\\[.*?\\]"
        
        /*
            默认的try
            try?
            try!
        */
        do {
            /*
                第一个参数: 正则表达式
                第二个参数: 针对正则表达式的一些设置, 不要刻意去记,学一个记一个
            */
            
            // 1. 创建正则
            let regx = try NSRegularExpression(pattern: pattern, options: .DotMatchesLineSeparators)
            
            // 2. 让正则去匹配查找
            /*
                第一个参数: 指定查找的字符串
                第二个参数: 默认值
                第三个参数: 范围
            */
            let results =  regx.matchesInString(text, options: [], range: NSMakeRange(0, text.characters.count))
            
            // 3. 就是对 查找结果进行遍历
            //  NSTextCheckingResult
            
            for (_,result) in results.reverse().enumerate() {
                
                // 获取查找结果的range
                let range = result.range
                // 通过range来获取查找的表情字符串
                let emoticonString = (text as NSString).substringWithRange(range)
                // 通过表情字符串,转换成表情对象
                let emoticon = HMEmoticonManager.searchEmoticon(emoticonString)
                
//                // 1. 创建一个附件
//                let attachment = NSTextAttachment()
//                // 2. 设置属性
//                if let png = emoticon?.png ,path = emoticon?.path {
//                    
//                    let imageName = "\(path)/\(png)"
//                    attachment.image = UIImage(named: imageName)
//                    
//                }
//                
//                // 3. 赋值给NSAttributeString
//                let attribute = NSAttributedString(attachment: attachment)
                
                let attachment = HMTextAttachment()
                
                attachment.emoticon = emoticon
                
                let attribute = attachment.getAttributeString(UIFont.systemFontOfSize(16))
                
            
                // 通过类方法,可以变成一行代码
                let attribute2 = HMTextAttachment.getAttributeString(emoticon, font: UIFont.systemFontOfSize(16))
                
                
                // globleAttribute = I  U
                // 进行一个替换 
                //MARK:-- TODO 强制解包崩溃了
                if let attribute = attribute {
                    
                    globleAttribute.replaceCharactersInRange(range, withAttributedString: attribute)
                }
                
            }
            
            /* 第一次打印还没有进行替换: I [嘻嘻] [嘻嘻] U{
        }
        
            
            ~~~~~~~~~~~~~~~~~
            
            第二次打印
            I {
            }￼{
            NSAttachment = "<NSTextAttachment: 0x7fbd787f9c00>";
            } [嘻嘻] U{
            }
            
*/
            
            
            // 遍历结束之后,再返回
            return globleAttribute
            
            
            
            
        } catch {
            printLog(error)
        }
        
        
        
        return NSAttributedString()
    }
}
